import java.util.*;
/**
 * 
 * 顺时针旋转矩阵
 * 
 * 描述

有一个NxN整数矩阵，请编写一个算法，将矩阵顺时针旋转90度。
给定一个NxN的矩阵，和矩阵的阶数N,请返回旋转后的NxN矩阵。

数据范围：
0
<
n
<
300
0<n<300，矩阵中的值满足 
0
≤
v
a
l
≤
1000
0≤val≤1000

要求：空间复杂度 
O
(
N
2
)
O(N 
2
 )，时间复杂度 
O
(
N
2
)
O(N 
2
 )
进阶：空间复杂度 
O
(
1
)
O(1)，时间复杂度 
O
(
N
2
)
O(N 
2
 )
 */
public class 顺时针旋转矩阵 {

    //[[1,2,3],[4,5,6],[7,8,9]],3
    
    public static void main(String[] args) {
        
        int[][] result = rotateMatrix(new int[][]{
            {1,2,3},
            {4,5,6},
            {7,8,9}
        }, 3);

        for(int i=0; i<result.length; i++){
            Arrays.stream(result[i]).forEach(System.out::print);
            System.out.println();
        }

    }

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 
     * @param mat int整型二维数组 
     * @param n int整型 
     * @return int整型二维数组
     */
    public static int[][] rotateMatrix (int[][] mat, int n) {
        // write code here

        // 水平翻转
        for (int i = 0; i < n / 2; i++) {
            int[] temp = mat[i];
            mat[i] = mat[n - i - 1];
            mat[n - i - 1] = temp;
        }
        // 主对角线翻转
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int temp = mat[i][j];
                mat[i][j] = mat[j][i];
                mat[j][i] = temp;
            }
        }

        return mat;
    }
}
